﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Zarzadzanie_Restautacja.Model;

namespace Zarzadzanie_Restautacja.Controllers
{
    public class Kuchnia : DbObject, IPracownik
    {
        #region Properties

        public int Id { get; set; }
        public string Imie { get; set; }
        public string Nazwisko { get; set; }
        public int Funkcja
        {
            get { return (int)Funkcje.Obsluga; }
            set { }
        }

        public Funkcje FunkcjaEnum
        {
            get { return (Funkcje)this.Funkcja; }
            set { this.Funkcja = (int)Funkcje.Obsluga; }
        }

        public string Haslo { get; set; }

        #endregion Properties

        #region Methods

        /// <summary>
        /// Zmienia status zamówienia na Dostarczone
        /// </summary>
        /// <param name="zamowienie">Zamówienie do zmiany</param>
        public void PrzyjmijZamowienie(Zamowienie zamowienie)
        {
            try
            {
                using (RestauracjaContext context = new RestauracjaContext())
                {
                    //Wszystkie propertiesy są przypisywane- inaczej nie działa update :(
                    zamowienie.Status = (int)Status.Dostarczone;
                    zamowienie.Cena = zamowienie.Cena;
                    zamowienie.data = zamowienie.data;
                    zamowienie.NrStolika = zamowienie.NrStolika;
                    zamowienie.Id = zamowienie.Id;

                    context.SaveChanges();
                }
            }
            catch (Exception)
            {
                MessageBox.Show("Wystapił błąd przy przyjmowaniu zamowienia");
            }
        }

        /// <summary>
        /// Zmienia status zamowionej potrawy (wydaje kelnerowi)
        /// </summary>
        /// <param name="zamowionaPotrawa">Potrawa do wydania kelnerowi</param>
        public void WydajKelnerowiPosilek(ZamowieniaPotrawy zamowionaPotrawa)
        {
            try
            {
                using (RestauracjaContext context = new RestauracjaContext())
                {
                    zamowionaPotrawa = context.ZamowieniaPotrawy
                        .Where(zampotr => zampotr.Id == zamowionaPotrawa.Id).FirstOrDefault();

                    if (zamowionaPotrawa != null)
                    {
                        zamowionaPotrawa.CzyWydana = (int)ZamowieniePotrawaStatus.KuchniaZlecilaDoKelnera;
                        zamowionaPotrawa.Id = zamowionaPotrawa.Id;
                        zamowionaPotrawa.IdPotrawy = zamowionaPotrawa.IdPotrawy;
                        zamowionaPotrawa.IdZamowienia = zamowionaPotrawa.IdZamowienia;
                        zamowionaPotrawa.Ilosc = zamowionaPotrawa.Ilosc;

                        context.SaveChanges();
                    }
                }

                this.ZmienStatusZamowienia(zamowionaPotrawa);
            }
            catch (Exception)
            {
                MessageBox.Show("Wystapił błąd przy wydawaniu posilka");
            }
        }

        /// <summary>
        /// Zmienia status zamówienia, na podstawie statusu potraw w tym zamówieniu
        /// Jesli wszystkie są już dostarczone kelnerowi, status zamówienia zostaje zmieniony
        /// </summary>
        /// <param name="zamowionaPotrawa">Zamówiona potrawa</param>
        private void ZmienStatusZamowienia(ZamowieniaPotrawy zamowionaPotrawa)
        {
            try
            {
                using (RestauracjaContext context = new RestauracjaContext())
                {
                    if (context.ZamowieniaPotrawy
                       .Where(zampotr => zampotr.IdZamowienia == zamowionaPotrawa.IdZamowienia)
                       .All(zampotr => zampotr.CzyWydana == (int)ZamowieniePotrawaStatus.KuchniaZlecilaDoKelnera))
                    {
                        Zamowienie zamowienieDoZmiany = context.Zamowienia
                            .Where(zam => zam.Id == zamowionaPotrawa.IdZamowienia).FirstOrDefault();

                        if (zamowienieDoZmiany != null)
                        {
                            //Wszystkie propertiesy są przypisywane- inaczej nie działa update :(
                            zamowienieDoZmiany.Status = (int)Status.DoOdebrania;
                            zamowienieDoZmiany.Cena = zamowienieDoZmiany.Cena;
                            zamowienieDoZmiany.data = zamowienieDoZmiany.data;
                            zamowienieDoZmiany.NrStolika = zamowienieDoZmiany.NrStolika;
                            zamowienieDoZmiany.Id = zamowienieDoZmiany.Id;

                            context.SaveChanges();
                        }
                    }
                }
            }
            catch (Exception)
            {
                MessageBox.Show("Wystapił błąd przy zmianie statusu zamowienia");
            }
        }

        #endregion Methods

    }
}
